﻿using System;
using System.Windows.Forms;
using System.IO;
using System.Security.Permissions;
using System.Text;


namespace Edigio
{
	public partial class formulario_principal : Form
	{

		public formulario_principal()
		{
			InitializeComponent();
		}

		/*
		 * A partir de acá, se declaran algunas propiedades
		 * del formulario.
		 */

		String ruta_del_archivo_de_configuracion = Application.StartupPath + Path.DirectorySeparatorChar + "fichero_de_configuracion";

		/*
		 * A partir de acá se definen los eventos.
		 */

		private void barra_de_botones__boton_guardar_Click(object sender, EventArgs e)
		{
			guardar_como();
		}

		private void menu_archivo__guardar_archivo_Click(object sender, EventArgs e)
		{
			guardar_como();
		}

		private void barra_de_botones__boton_nuevo_Click(object sender, EventArgs e)
		{
			nuevo_archivo();
		}

		private void menu_archivo__nuevo_archivo_Click(object sender, EventArgs e)
		{
			nuevo_archivo();
		}

		private void formulario_principal_Load(object sender, EventArgs e)
		{
			// Al cargar el formulario:

			// Primero se hace un nuevo archivo...
			nuevo_archivo();

			cargar_configuraciones_al_programa();


			// Por defecto, el ensamblado será generado con comandos
			// automáticos.
			barra_de_botones__combo_ensamblado_automatico_o_manual.SelectedIndex = 0;

		}

		private void menu_archivo__cerrar_archivo_Click(object sender, EventArgs e)
		{
			//cerrar_el_editor();
		}

		private void menu_archivo__salir_del_programa_Click(object sender, EventArgs e)
		{
			Application.Exit();
		}

		private void menu_configuracion__ajustar_fuente_del_editor_Click(object sender, EventArgs e)
		{
			FontDialog ajustes_de_fuentes = new FontDialog();

			ajustes_de_fuentes.ShowDialog();

			ajustes_de_fuentes.Dispose();
		}
		private void modificarComandoManualAUtilizarToolStripMenuItem_Click(object sender, EventArgs e)
		{
			//Form formulario_de_ensamblado_manual_visible = new formulario_de_ensamblado_manual();

			//formulario_de_ensamblado_manual_visible.ShowDialog();
		}

		private void barra_de_botones__boton_de_ensamblado_manual_ButtonClick(object sender, EventArgs e)
		{

		}

		private void barra_de_botones__boton_ensamblado_automatico_Click(object sender, EventArgs e)
		{
			//hace un hilo que ejecutará "ensamblar_automaticamente()".

			System.Threading.Thread hilo_nasm = new System.Threading.Thread(ensamblar_automaticamente);

			hilo_nasm.Start();
		}

		private void menu_configuracion__preferencias_Click(object sender, EventArgs e)
		{
			Formulario_de_configuraciones_2 instancia_del_formulario_de_configuraciones = new Formulario_de_configuraciones_2();

			instancia_del_formulario_de_configuraciones.ShowDialog();
		}

		private void barra_de_botones__boton_actualizar_Click(object sender, EventArgs e)
		{
			actualizar_archivo();
		}

		private void menu_archivo__actualizar_archivo_Click(object sender, EventArgs e)
		{
			actualizar_archivo();
		}

		private void barra_de_botones__boton_abrir_Click(object sender, EventArgs e)
		{
			abrir_archivo();
		}

		private void menu_archivo__abrir_archivo_Click(object sender, EventArgs e)
		{
			abrir_archivo();
		}
		private void menu_ver__cuadro_de_errores_CheckedChanged(object sender, EventArgs e)
		{
			//generar_cuadro_de_errores();
		}

		private void menu_busquedas__cuadro_de_busquedas_y_reemplazos_Click(object sender, EventArgs e)
		{
			formulario_de_busqueda_y_reemplazo formulario_de_busquedas_y_reemplazo_activo = new formulario_de_busqueda_y_reemplazo();

			formulario_de_busquedas_y_reemplazo_activo.Show();
		}

		private void barra_de_botones__boton_limpiar_codigo_Click(object sender, EventArgs e)
		{
			limpiar_codigo_del_editor_actual();

		}

		private void barra_de_botones__combo_ensamblado_automatico_o_manual_SelectedIndexChanged(object sender, EventArgs e)
		{
			if (barra_de_botones__combo_ensamblado_automatico_o_manual.SelectedIndex == 0)
			{
				barra_de_botones__boton_ensamblado_automatico.Enabled = true;
				barra_de_botones__boton_de_ensamblado_manual.Enabled = false;
			}
			else
			{
				barra_de_botones__boton_ensamblado_automatico.Enabled = false;
				barra_de_botones__boton_de_ensamblado_manual.Enabled = true;
			}
		}

		private void barra_de_botones__boton_seleccionar_todo_Click(object sender, EventArgs e)
		{
			seleccionar_todo();
		}

		private void númerosDeLíneaToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
		{
			if (menu_ver__numeros_de_linea.Checked)
			{
				ver_numeros_de_linea();
			}
			else
			{
				no_ver_numeros_de_linea();
			}

		}

		private void menu_ver_texto_ajustado_CheckedChanged()
		{
			if (menu_ver_texto_ajustado.Checked)
			{
				ajustar_texto();
			}
			else
			{
				no_ajustar_texto();
			}
		}

		private void menu_ver_eol_CheckedChanged(object sender, EventArgs e)
		{
			if (menu_ver_eol.Checked)
			{
				mostrar_EOL();
			}
			else
			{
				no_mostrar_EOL();
			}
		}

		protected void mostrar_formulario_de_bibliografia_recomendada()
		{
			Formulario_de_bibliografía_recomendada f = new Formulario_de_bibliografía_recomendada();

			f.ShowDialog();
		}

		private void menu_informacion__acerca_del_programa_Click(object sender, EventArgs e)
		{
			Formulario_acerca_de f = new Formulario_acerca_de();
			f.ShowDialog();
		}

		private void contenedor_de_pestanias_ControlAdded(object sender, ControlEventArgs e)
		{
			verificar_cantidad_de_pestanias();
		}

		private void contenedor_de_pestanias_ControlRemoved(object sender, ControlEventArgs e)
		{
			verificar_cantidad_de_pestanias();
		}

		/*
		 * A partir de acá se definen los métodos del formulario.
		 */

		public void nuevo_archivo()
		{
			// Se instancia pestaña
			TabPage pestania = new TabPage("programa (" + (contenedor_de_pestanias.TabPages.Count + 1).ToString() + ")");


			// Se instancia editor y se le da foco de antemano...
			Scintilla_para_edigio editor_de_edigio = new Scintilla_para_edigio();
			editor_de_edigio.Name = "editor";
			editor_de_edigio.Dock = DockStyle.Fill;
			editor_de_edigio.Encoding = Encoding.UTF8;

			//editor_de_edigio.Select();
			//editor_de_edigio.Focus();
			editor_de_edigio.Show();

			// A la pestaña instanciada se le añade el editor...
			pestania.Controls.Add(editor_de_edigio);

			Button boton_de_cierre = new Button();
			pestania.Controls.Add(boton_de_cierre);

			// Se añade al contenedor la pestaña instanciada...
			contenedor_de_pestanias.TabPages.Add(pestania);

			// Se le da foco a la nueva pestaña...
			contenedor_de_pestanias.SelectedIndex = contenedor_de_pestanias.TabCount - 1;

			// Se selecciona, para el resaltado de sintaxis, el lenguaje ensamblador.
			editor_de_edigio.ConfigurationManager.Language = "asm";
			//editor_de_edigio.ConfigurationManager.CustomLocation = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "lexico_asm" + Path.DirectorySeparatorChar + "asm.xml";
			editor_de_edigio.ConfigurationManager.Configure();

			// Se genera un márgen para mostrar los números de línea (en márgen 0).
			editor_de_edigio.Margins[0].Width = 35;

			//8,. Se configura el autocompletado...
			editor_de_edigio.AutoComplete.IsCaseSensitive = false;
			//editor_de_edigio.AutoComplete.Show();
		}

		public void abrir_archivo()
		{
			FileStream flujo_de_datos;
			StreamReader lector;


			//1.- Se pregunta dónde abrir...
			OpenFileDialog cuadro_de_apertura = new OpenFileDialog();

			cuadro_de_apertura.Title = "Elija un archivo fuente para abrir";
			cuadro_de_apertura.AutoUpgradeEnabled = true;
			cuadro_de_apertura.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop).ToLower().ToString();

			cuadro_de_apertura.ShowDialog();

			// Siempre y cuando el usuario haya seleccionado un marco y no haya cerrado la ventana...
			if (!(cuadro_de_apertura.FileName == ""))
			{
				//2.- Se genera una nueva pestaña con un nuevo editor que mantendrá los datos del archivo en disco.
				TabPage pestania = new TabPage(Path.GetFileName(cuadro_de_apertura.FileName));


				Scintilla_para_edigio editor_de_edigio = new Scintilla_para_edigio();

				editor_de_edigio.Dock = DockStyle.Fill;
				editor_de_edigio.Encoding = Encoding.UTF8;
				editor_de_edigio.Name = "editor";

				editor_de_edigio.Show();

				pestania.Controls.Add(editor_de_edigio);

				contenedor_de_pestanias.TabPages.Add(pestania);

				contenedor_de_pestanias.SelectedIndex = contenedor_de_pestanias.TabCount - 1;

				//3.- Se lee el archivo en la ruta especificada y guarda en el nuevo editor.
				flujo_de_datos = new FileStream(cuadro_de_apertura.FileName, FileMode.Open, FileAccess.Read);
				lector = new StreamReader(flujo_de_datos);

				editor_de_edigio.InsertText(lector.ReadToEnd());
				lector.Close();

				//4.- Se almacena la ruta a la carpeta y la ruta del archivo en las respectivas propiedades del editor...
				editor_de_edigio.ruta_a_carpeta_donde_se_encuentra_el_archivo = Path.GetDirectoryName(cuadro_de_apertura.FileName);

				editor_de_edigio.ruta_de_archivo = cuadro_de_apertura.FileName;

				//5.- Como el editor se modificó, se pone la bandera modified a false
				// para tomar en cuenta las modificaciónes sobre el texto.
				editor_de_edigio.Modified = false;

				//6.- Se selecciona, para el resaltado de sintaxis, el lenguaje ensamblador.
				editor_de_edigio.ConfigurationManager.Language = "ASM";
				editor_de_edigio.ConfigurationManager.Configure();

				//7.- Se genera un márgen para mostrar los números de línea (en márgen 0).
				editor_de_edigio.Margins[0].Width = 35;

				//8,. Se configura el autocompletado...
				editor_de_edigio.AutoComplete.IsCaseSensitive = false;
				//editor_de_edigio.AutoComplete.Show();

			}
		}

		private void ensamblar_automaticamente()
		{
			/* Hilo que ejecuta nasm enviándole las opciónes
			 * seleccionadas en la configuración.
			 * Si hay algún error, nasm genera el mensaje que edigio mostrará.
			 */

			Rutas_de_nasm ruta_de_nasm = new Rutas_de_nasm();

			/* Cada sistema operativo tiene un lugar específico en donde se encuentra nasm.
			 * Cada condicional verifica cual s.o. es para saber dónde se ecuentra
			 * el ejecutable.
			 * 
			 * Si el ejecutable no existe muestra un mensaje de error.
			 */

			if (Configuracion_de_edigio_actual.sistema_operativo_en_uso == Sistemas_operativos.windows)
			{
				// si no está nasm presente...
				if (!File.Exists(ruta_de_nasm.ruta_en_windows))
				{
					MessageBox.Show("Netwide assembler (NASM) no está instalado.\n Descarguelo desde http://www.nasm.us/.");
				}
				else //si está presente el ejecutable de nasm...
				{
					try
					{
						System.Diagnostics.Process.Start(ruta_de_nasm.ruta_en_windows);
					}
					catch (Exception e)
					{
						MessageBox.Show("Hubo una excepción en ensamblar_automaticamente().\n" + e.Message);
					}
				}
			}
			else if (Configuracion_de_edigio_actual.sistema_operativo_en_uso == Sistemas_operativos.gnulinux)
			{
				// si no está nasm presente...
				if (!File.Exists(ruta_de_nasm.ruta_en_gnulinux))
				{
					MessageBox.Show("Netwide assembler(NASM) no está instalado.\n Instálelo escribiendo: sudo aptitude install nasm, si tiene un s.o. que utilice apt-get.");
				}
				else //si está presente el ejecutable de nasm...
				{
					try
					{
						System.Diagnostics.Process.Start(ruta_de_nasm.ruta_en_gnulinux);
					}
					catch (Exception e)
					{
						MessageBox.Show("Hubo una excepción en ensamblar_automaticamente().\n" + e.Message);
					}
				}
			}
			else //si es mac os...
			{
				// si no está nasm presente...
				if (!File.Exists(ruta_de_nasm.ruta_en_macos))
				{
					MessageBox.Show("Netwide assembler(NASM) no está instalado.\n Descarguelo desde http://www.nasm.us/.");
				}
				else // si está presente el ejecutable de nasm...
				{
					try
					{
						System.Diagnostics.Process.Start(ruta_de_nasm.ruta_en_macos);
					}
					catch (Exception e)
					{
						MessageBox.Show("Hubo una excepción en ensamblar_automaticamente().\n" + e.Message);
					}
				}
			}
		}

		private void resaltar_sintaxis()
		{
		}

		public static void cargar_configuraciones_al_programa()
		{

			// Si existe el archivo de configuraciónes, entonces cargar la
			// clase estática Configuracion_de_edigio_actual.

			// Si no existe el archivo de configuraciónes, entonces grabar a disco
			// un archivo con los datos de Configuracion_de_edigio_predeterminada;
			// y cargar de esa clase a la clase Configuración_de_edigio_actual.

			if (File.Exists(Configuracion_de_edigio_predeterminada.ruta_al_archivo_de_configuraciones))
			{
				// se lee el archivo a memoria.
				// TENER EN CUENTA que se lee en el orden en que fué grabado (mirar abajo en el else).

				String[] propiedades_leidas_del_disco = System.IO.File.ReadAllLines(Configuracion_de_edigio_predeterminada.ruta_al_archivo_de_configuraciones);

				// y acá se asigna lo leído a cada propiedad estática de la configuración actual...

				Configuracion_de_edigio_actual.esquema_de_codigo_predeterminado = propiedades_leidas_del_disco[0];
				Configuracion_de_edigio_actual.optimización = propiedades_leidas_del_disco[1];
				Configuracion_de_edigio_actual.parametros_adicionales = propiedades_leidas_del_disco[2];
				Configuracion_de_edigio_actual.sistema_operativo_en_uso = propiedades_leidas_del_disco[3];
				Configuracion_de_edigio_actual.tipo_de_fichero_objeto = propiedades_leidas_del_disco[4];
			}
			else
			{
				// se crea el archivo con lo predeterminado.
				// Para hacerlo, pongo en una matriz cada propiedad y luego
				// grabo todas las líneas (para luego leer línea por línea).

				String [] propiedades_predeterminadas_a_grabar = {
											 Configuracion_de_edigio_predeterminada.esquema_de_codigo_predeterminado, Configuracion_de_edigio_predeterminada.optimización, Configuracion_de_edigio_predeterminada.parametros_adicionales, Configuracion_de_edigio_predeterminada.sistema_operativo_predeterminado, Configuracion_de_edigio_predeterminada.tipo_de_fichero_objeto
										 };
				// Con este método grabo todas las líneas del anterior listado.
				System.IO.File.WriteAllLines(Configuracion_de_edigio_predeterminada.ruta_al_archivo_de_configuraciones, propiedades_predeterminadas_a_grabar);

				// ...y se carga la configuración por defecto.
				Configuracion_de_edigio_actual.esquema_de_codigo_predeterminado = Configuracion_de_edigio_predeterminada.esquema_de_codigo_predeterminado;

				Configuracion_de_edigio_actual.optimización = Configuracion_de_edigio_predeterminada.optimización;

				Configuracion_de_edigio_actual.parametros_adicionales = Configuracion_de_edigio_predeterminada.parametros_adicionales;

				Configuracion_de_edigio_actual.tipo_de_fichero_objeto = Configuracion_de_edigio_predeterminada.tipo_de_fichero_objeto;

				Configuracion_de_edigio_actual.sistema_operativo_en_uso = Configuracion_de_edigio_predeterminada.sistema_operativo_predeterminado;
			}
		}

		ulong obtener_tamanio_de_un_archivo(String ruta)
		{
			Stream flujo_de_datos = File.OpenRead(ruta);
			flujo_de_datos.Seek(0, SeekOrigin.End);
			ulong tamanio = (ulong)flujo_de_datos.Length;

			flujo_de_datos.Close();
			return tamanio;
		}

		public void actualizar_archivo()
		{
			/* Resumen: 
			 * Para el editor que tiene el foco
			 *	si no está modificado el editor, retornar.
			 *	<si está modificado>
			 *		si es null la ruta del editor (porque no abrio un archivo existente, hizo uno nuevo) entonces guardar como().
			 *		sino sobreescribir el archivo de disco con uno con el texto modificado del editor.
			 *	poner a false la bandera del editor "modified".
			 */

			int indice_de_pestania_que_tiene_el_foco = contenedor_de_pestanias.SelectedIndex;

			
				Scintilla_para_edigio editor_temporal_representante_del_editor_que_tiene_el_foco = (Scintilla_para_edigio)contenedor_de_pestanias.Controls[indice_de_pestania_que_tiene_el_foco].Controls[0];
			
			

			FileStream flujo_al_archivo;
			BinaryWriter escritor;

			if (!editor_temporal_representante_del_editor_que_tiene_el_foco.Modified)
			{
				return;
			}

			if (editor_temporal_representante_del_editor_que_tiene_el_foco.ruta_de_archivo == null)
			{
				guardar_como();
			}
			else
			{

				// Para actualizar, primero borra al archivo y luego lo crea devuelta.
				if (File.Exists(editor_temporal_representante_del_editor_que_tiene_el_foco.ruta_de_archivo))
				{
					File.Delete(editor_temporal_representante_del_editor_que_tiene_el_foco.ruta_de_archivo);
				}

				try
				{
					flujo_al_archivo = File.Create(editor_temporal_representante_del_editor_que_tiene_el_foco.ruta_de_archivo.ToString());

					escritor = new BinaryWriter(flujo_al_archivo);

					escritor.Write(editor_temporal_representante_del_editor_que_tiene_el_foco.Text);

					flujo_al_archivo.Close();

					// Por último pone modificado a falso...
					editor_temporal_representante_del_editor_que_tiene_el_foco.Modified = false;
				}
				catch (System.UnauthorizedAccessException e)
				{
					MessageBox.Show(e.Message);
				}

			}
		}

		public void guardar_como()
		{
			SaveFileDialog cuadro_de_guardado = new SaveFileDialog();

			FileStream flujo_al_archivo;
			BinaryWriter escritor;

			int indice_de_pestania_que_tiene_el_foco = contenedor_de_pestanias.SelectedIndex;

			// Si se presiona guardar como, o guardar, la excepción se ignora...
			
				Scintilla_para_edigio editor_temporal_representante_del_editor_que_tiene_el_foco = (Scintilla_para_edigio)contenedor_de_pestanias.Controls[indice_de_pestania_que_tiene_el_foco].Controls[0];
			

			cuadro_de_guardado.Title = "Elija un lugar para guardar su código";
			cuadro_de_guardado.AutoUpgradeEnabled = true;
			cuadro_de_guardado.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop).ToLower().ToString();

			cuadro_de_guardado.ShowDialog();

			if (cuadro_de_guardado.FileName == "")
			{
				return;
			}

			// una vez pedido la ruta de archivo para guardar, se ajusta esta propiedad para luego poder actualizar sin pedir nuevamente la ruta de archivo.
			editor_temporal_representante_del_editor_que_tiene_el_foco.ruta_de_archivo = cuadro_de_guardado.FileName;

			try
			{
				//crea el archivo y genera la conexión...
				flujo_al_archivo = File.Create(cuadro_de_guardado.FileName, 2048, FileOptions.None);

				//instancia el escritor con la conexión actual...

				escritor = new BinaryWriter(flujo_al_archivo);

				escritor.Write(editor_temporal_representante_del_editor_que_tiene_el_foco.Text);

				flujo_al_archivo.Close();

				// Por último pone modificado a falso...
				editor_temporal_representante_del_editor_que_tiene_el_foco.Modified = false;
			}
			catch (System.UnauthorizedAccessException e)
			{
				MessageBox.Show(e.Message);
			}

			// Por último actualiza el nombre de la pestaña con el nombre del archivo actual.
			//contenedor_de_pestanias[contenedor_de_pestanias.SelectedIndex] =

		}

		public void limpiar_codigo_del_editor_actual()
		{
			contenedor_de_pestanias.TabPages[contenedor_de_pestanias.SelectedIndex].Controls["editor"].Text = "";


		}

		public void seleccionar_todo()
		{
			// Para el editor que tiene el foco, seleccionar todo.

			Scintilla_para_edigio editor = (Scintilla_para_edigio)contenedor_de_pestanias.SelectedTab.Controls["editor"];

			//editor.Selection.Start = 0;
			//editor.Selection.End = -1;

			//editor.Selection = ScintillaNET.SelectionMode.
		}

		public void ver_numeros_de_linea()
		{
			/*
			 * Se modifica el ancho del márgen izq [0] para ver.
			 * Esto se aplica para cada editor.
			 */

			// por cada pestaña...
			foreach (TabPage pestania in contenedor_de_pestanias.TabPages)
			{
				Scintilla_para_edigio editor = (Scintilla_para_edigio)pestania.Controls["editor"];
				editor.Margins[0].Width = 35;
			}
		}

		public void no_ver_numeros_de_linea()
		{
			/*
			 * Se modifica el ancho del márgen izq [0] para NO ver.
			 * Esto se aplica para cada editor.
			 */


			// por cada pestaña...
			foreach (TabPage pestania in contenedor_de_pestanias.TabPages)
			{
				// para el editor de pestaña[i]
				Scintilla_para_edigio editor = (Scintilla_para_edigio)pestania.Controls["editor"];
				editor.Margins[0].Width = 0;
			}

		}




		public void ajustar_texto()
		{
			/*
			 * Con el ajuste de texto, la oración se ajusta al ancho del editor evitando las
			 * líneas de desplazamiento.
			 */

			// por cada pestaña...
			foreach (TabPage pestania in contenedor_de_pestanias.TabPages)
			{
				// para el editor de pestaña[i]
				Scintilla_para_edigio editor = (Scintilla_para_edigio)pestania.Controls["editor"];
				editor.LineWrapping.Mode = ScintillaNET.LineWrappingMode.Word;
			}
		}

		public void no_ajustar_texto()
		{
			/*
			 * Con el NO ajuste de texto, la oración no se ajusta al ancho del editor y por lo tanto
			 * las líneas de desplazamiento aparecen si es muy larga.
			 */

			// por cada pestaña...
			foreach (TabPage pestania in contenedor_de_pestanias.TabPages)
			{
				// para el editor de pestaña[i]
				Scintilla_para_edigio editor = (Scintilla_para_edigio)pestania.Controls["editor"];
				editor.LineWrapping.Mode = ScintillaNET.LineWrappingMode.None;
			}
		}



		public void mostrar_EOL()
		{
			/*
			 * Al mostrar EOL se podrá visualizar el caracter de fin de línea.
			 */

			// por cada pestaña...
			foreach (TabPage pestania in contenedor_de_pestanias.TabPages)
			{
				// para el editor de pestaña[i]
				Scintilla_para_edigio editor = (Scintilla_para_edigio)pestania.Controls["editor"];
				editor.EndOfLine.IsVisible = true;
			}
		}

		public void no_mostrar_EOL()
		{
			// por cada pestaña...
			foreach (TabPage pestania in contenedor_de_pestanias.TabPages)
			{
				// para el editor de pestaña[i]
				Scintilla_para_edigio editor = (Scintilla_para_edigio)pestania.Controls["editor"];
				editor.EndOfLine.IsVisible = false;
			}
		}

		private void menu_informacion__bibliografia_recomendada_Click(object sender, EventArgs e)
		{
			mostrar_formulario_de_bibliografia_recomendada();
		}

		private void menu_informacion__tips_Click(object sender, EventArgs e)
		{
			mostrar_cuadro_de_tips();
		}

		private void mostrar_cuadro_de_tips()
		{
			Cuadro_de_tips cuadro = new Cuadro_de_tips();

			cuadro.Show();
		}

		private void verificar_cantidad_de_pestanias()
		{
			// si no hay pestañas activas...
			if (contenedor_de_pestanias.Controls.Count == 0)
			{
				// desactivar los botónes guardar y guardar como...
				barra_de_botones__boton_actualizar.Enabled = false;
				barra_de_botones__boton_guardar.Enabled = false;
			}
			else
			{
				// sino, activar los botónes guardar y guardar como...
				barra_de_botones__boton_actualizar.Enabled = true;
				barra_de_botones__boton_guardar.Enabled = true;
			}
		}

		

	}



}